<?php
/**     
  *
  * Copyright (c) 2009, Persistent Systems Limited
  *
  * Redistribution and use, with or without modification, are permitted 
  *  provided that the following  conditions are met:
  *   - Redistributions of source code must retain the above copyright notice, 
  *     this list of conditions and the following disclaimer.
  *   - Neither the name of Persistent Systems Limited nor the names of its contributors 
  *     may be used to endorse or promote products derived from this software 
  *     without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
/**
 *  For ACS constants
 */ 
require_once 'ACS/ACSConstants.php';

/**
 *  For set/get Scope properties
 */ 
require_once 'ACS/Scope.php';

/**
 *  For set/get Authentication properties
 */
require_once 'ACS/Authentication.php';

/**
 *  For set/get web proxy details
 */ 
require_once 'util/HttpWebProxy.php';

/**
 *  For getting Audit Log related properties and Methods
 */ 
require_once 'util/LoggerClass.php';

/**
 * Class SWT For getting SWT Token
 * @access public
 */
class SWT extends Authentication
{
    /**
     * constructor
     */
    public function __construct($acmHostName, $serviceName)
    {
        parent::__construct($acmHostName, $serviceName);
    }
    
    /**
     * Get access token
     * @return string Returns the ACS token
     */
    function getACSToken()
    {

        $scope = $this->getScope();
        
        $postData = WRAP_APPLIES_TO . '=' . urlencode($scope->getAppliesTo()) . 
              '&' . WRAP_ASSERTION_FORMAT . '=' . WRAP_SWT_ASSERTION_FORMAT . 
              '&' . WRAP_ASSERTION . '=' .urlencode($scope->getSimpleWebToken());
        
        // Add custom input claims (if any)
        $customClaims = $scope->getCustomInputClaims();
        if (!empty($customClaims))
        {
            foreach ($customClaims  as $key => $value)
            {
                $postData  = $postData . '&' . $key . '=' . $value;
            }
        }
        
        $serviceURI=$scope->getServiceURI();
        $curlRequest = new CurlRequest($serviceURI);
        $httpWebProxy = $this->getHttpWebProxy();
        
        if(isset($httpWebProxy))
        {
            //set the proxy credentials for curl request
            $curlRequest->setHttpWebProxy($httpWebProxy);
        }
        $curlRequest->httpVerb= POST_METHOD;
        $curlRequest->postFields= $postData;
        $httpAuthSwtToken = $curlRequest->process();
        
        //Do Audit logging if set to true
        if (LoggerClass::$doAuditLog)
        {
            $requestInfo = $curlRequest->getInfo();
            LoggerClass::writeLogEntry(REQUEST_TO_ACS.'-'.GET_ACS_TOKEN, $requestInfo);
            LoggerClass::writeLogEntry(RESPONSE_FROM_ACS.'-'.GET_ACS_TOKEN, urlencode($httpAuthSwtToken));
        }

        return $httpAuthSwtToken;
    }
}
?>
